import { getObjType, rgbTohex } from '../utils/util'
import { getSheetIndex } from '../methods/get'
import server from '../controllers/server'
import formula from './formula'
import editor from './editor'
import { dynamicArrayCompute } from './dynamicArray'
import sheetmanage from '../controllers/sheetmanage'
import {
  isInlineStringCT,
  isInlineStringCell,
  convertCssToStyleList,
} from '../controllers/inlineString'
import locale from '../locale/locale'
import Store from '../store'

//Get selection range value
export function getdatabyselection(range, sheetIndex) {
  if (range == null) {
    range = Store.luckysheet_select_save[0]
  }

  if (range['row'] == null || range['row'].length == 0) {
    return []
  }

  //取数据
  let d, cfg
  if (sheetIndex != null && sheetIndex != Store.currentSheetIndex) {
    d = Store.luckysheetfile[getSheetIndex(sheetIndex)]['data']
    cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)]['config']
  } else {
    d = editor.deepCopyFlowData(Store.flowdata)
    cfg = Store.config
  }

  let data = []

  for (let r = range['row'][0]; r <= range['row'][1]; r++) {
    if (d[r] == null) {
      continue
    }

    if (cfg['rowhidden'] != null && cfg['rowhidden'][r] != null) {
      continue
    }

    let row = []

    for (let c = range['column'][0]; c <= range['column'][1]; c++) {
      row.push(d[r][c])
    }

    data.push(row)
  }

  return data
}

export function getdatabyselectionD(d, range) {
  if (range == null || range['row'] == null || range['row'].length == 0) {
    return []
  }

  let dynamicArray_compute = dynamicArrayCompute(
    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['dynamicArray']
  )
  let data = []

  if (d == null) {
    return data
  }

  for (let r = range['row'][0]; r <= range['row'][1]; r++) {
    if (d[r] == null) {
      continue
    }

    // if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
    //     continue;
    // }

    let row = []

    for (let c = range['column'][0]; c <= range['column'][1]; c++) {
      let value

      if (r + '_' + c in dynamicArray_compute) {
        value = dynamicArray_compute[r + '_' + c]
      } else {
        value = d[r][c]
      }

      row.push(value)
    }

    data.push(row)
  }

  return data
}

export function getdatabyselectionNoCopy(range) {
  if (range == null || range['row'] == null || range['row'].length == 0) {
    return []
  }

  let data = []

  for (let r = range['row'][0]; r <= range['row'][1]; r++) {
    let row = []

    if (
      Store.config['rowhidden'] != null &&
      Store.config['rowhidden'][r] != null
    ) {
      continue
    }

    for (let c = range['column'][0]; c <= range['column'][1]; c++) {
      let value = ''

      if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
        value = Store.flowdata[r][c]
      }

      row.push(value)
    }

    data.push(row)
  }

  return data
}

//Get the value of the cell
export function getcellvalue(r, c, data, type) {
  if (type == null) {
    type = 'v'
  }

  if (data == null) {
    data = Store.flowdata
  }

  let d_value

  if (r != null && c != null) {
    d_value = data[r][c]
  } else if (r != null) {
    d_value = data[r]
  } else if (c != null) {
    let newData = data[0].map(function(col, i) {
      return data.map(function(row) {
        return row[i]
      })
    })
    d_value = newData[c]
  } else {
    return data
  }

  let retv = d_value

  if (getObjType(d_value) == 'object') {
    retv = d_value[type]

    if (type == 'f' && retv != null) {
      retv = formula.functionHTMLGenerate(retv)
    } else if (type == 'f') {
      retv = d_value['v']
    } else if (d_value && d_value.ct && d_value.ct.t == 'd') {
      retv = d_value.m
    }
  }

  if (retv == undefined) {
    retv = null
  }

  return retv
}

//Data increase in rows and columns
export function datagridgrowth(data, addr, addc, iscallback) {
  if (addr <= 0 && addc <= 0) {
    return data
  }

  if (addr <= 0) {
    addr = 0
  }

  if (addc <= 0) {
    addc = 0
  }

  let dataClen = 0
  if (data.length == 0) {
    data = []
    dataClen = 0
  } else {
    dataClen = data[0].length
  }

  let coladd = [] //需要额外增加的空列
  for (let c = 0; c < addc; c++) {
    coladd.push(null)
  }

  let rowadd = [] //完整的一个空行
  for (let r = 0; r < dataClen + addc; r++) {
    rowadd.push(null)
  }

  for (let r = 0; r < data.length; r++) {
    data[r] = [].concat(data[r].concat(coladd))
  }

  for (let r = 0; r < addr; r++) {
    data.push([].concat(rowadd))
  }

  if (!!iscallback) {
    server.saveParam('all', Store.currentSheetIndex, data.length, { k: 'row' })
    server.saveParam('all', Store.currentSheetIndex, data[0].length, {
      k: 'column',
    })
  }

  return data
}

//Get the formula of the cell
export function getcellFormula(r, c, i, data) {
  let cell
  if (data != null) {
    cell = data[r][c]
  } else {
    cell = getOrigincell(r, c, i)
  }

  if (cell == null) {
    return null
  }

  return cell.f
}

export function getOrigincell(r, c, i) {
  if (r == null || c == null) {
    return
  }
  let data
  if (i == null) {
    data = Store.flowdata
  } else {
    let sheet = sheetmanage.getSheetByIndex(i)
    data = sheet.data
  }

  if (!data || !data[r] || !data[r][c]) {
    return
  }

  return data[r][c]
}

export function getRealCellValue(r, c) {
  let value = getcellvalue(r, c, null, 'm')
  if (value == null) {
    value = getcellvalue(r, c)
    if (value == null) {
      let ct = getcellvalue(r, c, null, 'ct')
      if (isInlineStringCT(ct)) {
        value = ct.s
      }
    }
  }

  return value
}

export function getInlineStringNoStyle(r, c) {
  let ct = getcellvalue(r, c, null, 'ct')
  if (isInlineStringCT(ct)) {
    let strings = ct.s,
      value = ''
    for (let i = 0; i < strings.length; i++) {
      let strObj = strings[i]
      if (strObj.v != null) {
        value += strObj.v
      }
    }
    return value
  }

  return ''
}

export function getInlineStringStyle(r, c, data) {
  let ct = getcellvalue(r, c, data, 'ct')
  if (data == null) {
    data = Store.flowdata
  }
  let cell = data[r][c]
  if (isInlineStringCT(ct)) {
    let strings = ct.s,
      value = ''
    for (let i = 0; i < strings.length; i++) {
      let strObj = strings[i]
      if (strObj.v != null) {
        let style = getFontStyleByCell(strObj)
        value +=
          "<span index='" +
          i +
          "' style='" +
          style +
          "'>" +
          strObj.v +
          '</span>'
      }
    }
    return value
  }

  return ''
}

export function getFontStyleByCell(cell, checksAF, checksCF, isCheck = true) {
  if (cell == null) {
    return
  }
  let style = ''
  const _locale = locale()
  const locale_fontarray = _locale.fontarray
  for (let key in cell) {
    let value = cell[key]
    if (isCheck) {
      value = checkstatusByCell(cell, key)
    }
    if (key == 'bl' && value != '0') {
      style += 'font-weight: bold;'
    }

    if (key == 'it' && value != '0') {
      style += 'font-style:italic;'
    }

    if (key == 'ff') {
      let f = value
      if (!isNaN(parseInt(value))) {
        f = locale_fontarray[parseInt(value)]
      } else {
        f = value
      }
      style += 'font-family: ' + f + ';'
    }

    if (key == 'fs' && value != '10') {
      style += 'font-size: ' + value + 'pt;'
    }

    if (
      (key == 'fc' && value != '#000000') ||
      checksAF != null ||
      (checksCF != null && checksCF['textColor'] != null)
    ) {
      if (checksCF != null && checksCF['textColor'] != null) {
        style += 'color: ' + checksCF['textColor'] + ';'
      } else if (checksAF != null) {
        style += 'color: ' + checksAF[0] + ';'
      } else {
        style += 'color: ' + value + ';'
      }
    }

    if (key == 'cl' && value != '0') {
      style += 'text-decoration: line-through;'
    }
  }
  return style
}

export function checkstatusByCell(cell, a) {
  let foucsStatus = cell
  let tf = { bl: 1, it: 1, ff: 1, cl: 1, un: 1 }

  if (a in tf || (a == 'fs' && isInlineStringCell(cell))) {
    if (foucsStatus == null) {
      foucsStatus = '0'
    } else {
      // var  w = window.getSelection(), isInlineEdit=false;
      // if(w.type!="None"){
      //     var range = w.getRangeAt(0);
      //     let startContainer = range.startContainer;
      //     if (parseInt($("#luckysheet-input-box").css("top")) > 0 && startContainer.parentNode.tagName=="SPAN" && !range.collapsed) {
      //         let span = startContainer.parentNode;
      //         let styleList = convertCssToStyleList(span.style.cssText);
      //         foucsStatus = styleList[a];
      //         isInlineEdit = true;
      //     }
      // }

      // if(!isInlineEdit){
      //     if(isInlineStringCell(cell)){
      //         foucsStatus = cell.ct.s[0][a];
      //     }
      //     else{
      //         foucsStatus = foucsStatus[a];
      //     }
      // }

      foucsStatus = foucsStatus[a]

      if (foucsStatus == null) {
        foucsStatus = '0'
      }
    }
  } else if (a == 'fc') {
    if (foucsStatus == null) {
      foucsStatus = '#000000'
    } else {
      foucsStatus = foucsStatus[a]

      if (foucsStatus == null) {
        foucsStatus = '#000000'
      }

      if (foucsStatus.indexOf('rgba') > -1) {
        foucsStatus = rgbTohex(foucsStatus)
      }
    }
  } else if (a == 'bg') {
    if (foucsStatus == null) {
      foucsStatus = null
    } else {
      foucsStatus = foucsStatus[a]

      if (foucsStatus == null) {
        foucsStatus = null
      } else if (foucsStatus.toString().indexOf('rgba') > -1) {
        foucsStatus = rgbTohex(foucsStatus)
      }
    }
  } else if (a.substr(0, 2) == 'bs') {
    if (foucsStatus == null) {
      foucsStatus = 'none'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = 'none'
      }
    }
  } else if (a.substr(0, 2) == 'bc') {
    if (foucsStatus == null) {
      foucsStatus = '#000000'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = '#000000'
      }
    }
  } else if (a == 'ht') {
    if (foucsStatus == null) {
      foucsStatus = '1'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = '1'
      }
    }

    if (['0', '1', '2'].indexOf(foucsStatus.toString()) == -1) {
      foucsStatus = '1'
    }
  } else if (a == 'vt') {
    //默认垂直居中
    if (foucsStatus == null) {
      foucsStatus = '0'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = '0'
      }
    }

    if (['0', '1', '2'].indexOf(foucsStatus.toString()) == -1) {
      foucsStatus = '0'
    }
  } else if (a == 'ct') {
    if (foucsStatus == null) {
      foucsStatus = null
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = null
      }
    }
  } else if (a == 'fs') {
    if (foucsStatus == null) {
      foucsStatus = '10'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = '10'
      }
    }
  } else if (a == 'tb') {
    if (foucsStatus == null) {
      foucsStatus = '0'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = '0'
      }
    }
  } else if (a == 'tr') {
    if (foucsStatus == null) {
      foucsStatus = '0'
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = '0'
      }
    }
  } else if (a == 'rt') {
    if (foucsStatus == null) {
      foucsStatus = null
    } else {
      foucsStatus = foucsStatus[a]
      if (foucsStatus == null) {
        foucsStatus = null
      }
    }
  }

  return foucsStatus
}

export function textTrim(x) {
  if (x == null || x.length == 0) {
    return x
  }
  return x.replace(/^\s+|\s+$/gm, '')
}
